import multiprocessing
import logging
import sys
import time

logging.basicConfig(
    level=logging.INFO,
    format="%(name)s%(process)d%(processName)s%(thread)d%(message)s",
    stream=sys.stdout
)
log=logging.getLogger(__name__)

def show(i):
    log.info(f'我启动了{i}')

def worker(k):
    time.sleep(2)
    log.info(f'正在打印{k}')

if __name__ == '__main__':
    pool=multiprocessing.Pool(processes=2,initializer=show,initargs=(8,),maxtasksperchild=None)
    time.sleep(3)
    for i in range(4):
        pool.apply(worker,args=(i+5,))
# processes #进程池最大使用的工作进程数量，默认值为None，会使用os.cpu_count()来获取cpu的数量作为最大进程数量。
#
# initializer #进程初始化函数，进程初始化时会调用该函数。
#
# initargs #参数，为initializer函数调用时传递的参数。
#
# maxtasksperchild #工作进程退出前可以完成的任务数，完成后用一个新的工作进程来替代原进程，让闲置的资源释放，默认是None，
# 此意味只要Pool存在工作进程就一直存活(如果改为maxtasksperchild=1每次线程执行worker时都会重新创建一个新的进程并执行show)
#
# context #用在制定工作进程启动时的上下文，一般使用multiprocessing.Pool()或者一个context对象的Pool()方法来创建一个池，
# 两种方法都适当的设置了context。(context中有一个进程或者工作任务的队列，会产生阻塞，保证进程会永久存在。)
#
# 注意Pool创建后，会立即实例化指定个数的进程。以备使用
